# -*- coding:utf-8 -*-
# 单线程：第一个函数，执行完才执行第二个

# 线程创建与管理
"""
创建线程
    Python提供了threading模块来进行线程的创建与管理，
    创建一个线程需要指定该线程执行的任务（函数名）、以及该函数需要的参数，
"""

import time
import threading


def func_one():
    while True:
        print("我正在唱歌")
        time.sleep(1)


def func_two():
    while True:
        print("我正在打游戏")
        time.sleep(1)


"""
# 注意：Python在进程启动起来后，会自动创建一个主线程，
# 之后使用多线程机制可以在此基础上进行分支，产生新的子线程。
# 子线程启动起来后，主线程默认会等待所有线程执行完成之后再退出。
# 但是我们可以将子线程设置为守护线程，此时主线程任务一旦完成，
# 所有子线程将会和主线程一起结束（就算子线程没有执行完也会退出）。
"""


if __name__ == '__main__':
    # 创建两个子线程t1、t2，分别执行func_one和func_two
    t1 = threading.Thread(target=func_one, daemon=True)       # 设置守护线程
    t2 = threading.Thread(target=func_two, daemon=True)       # 设置守护线程
    # 启动线程
    t1.start()
    t2.start()
    print(threading.enumerate())

    # 设置线程阻塞
    """
    我们可以用join()方法使主线程陷入阻塞，以等待某个线程执行完毕。
    因此这也是实现线程同步的一种方式。参数 timeout 可以用来设置主线程陷入阻塞的时间，
    如果线程不是守护线程，即没有设置daemon为True，那么参数 timeout 是无效的，
    主线程会一直阻塞，直到子线程执行结束。
    """

    print("程序因线程一陷入阻塞")
    t1.join(timeout=3)
    print("程序因线程二陷入阻塞")
    t2.join(timeout=3)
    print("主线程已退出")
